home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / cheesesauce / links.s < prev    next >
Text File  |  1997-11-28  |  2KB  |  163 lines

  1. conaddr: dc.l 0
  2. linkaddr: dc.l 0
  3. distaddr: dc.l 0
  4. num: dc.w 0
  5.  
  6. start:
  7.  lea conaddr(pc),a0
  8.  move.w 12(a0),d7
  9.  move.l 8(a0),a2
  10.  move.l 4(a0),a1
  11.  move.l (a0),a0
  12.  
  13.  move.l a1,a3
  14.  move.l a2,a4
  15.  move.w d7,d0
  16.  muls d0,d0
  17.  subq #1,d0
  18. initloop:
  19.  move.b #-1,(a3)+
  20.  move.w #1000,(a4)+
  21.  dbra d0,initloop
  22.  
  23. * Now link all those ones connected
  24. * directly
  25.  
  26.  move.l a0,a3    ; a0/a3=source connections
  27.  move.l a1,a4   ; a1/a4=dest. links
  28.  move.l a2,a5    ; a2/a5=dest. distances
  29.  move.w d7,d0
  30.  move.w #0,d2
  31. downlink:
  32.  move.w d7,d1
  33.  move.w #0,d3
  34. acrosslink:
  35.  
  36.  move.b (a3)+,d4 ; Is point A linked to point B?
  37.  beq.s nolink
  38.  
  39.  cmp.b #1,d4     ; Can you walk from A to B?
  40.  beq.s reallink
  41. ; You can only SEE point B from point A.
  42.  
  43.  move.b d3,(a4)
  44.  or.b #128,(a4)
  45.  move.w #100,(a5) ; make it prefer walking.
  46.  bra.s nolink
  47.  
  48. reallink:    ; Yes
  49.  
  50.  move.b d3,(a4)    ; Yes: put into 'next point'
  51.  move.w #1,(a5) ; Set distance to 1.
  52. nolink:        ; No
  53.  addq #1,a4
  54.  addq #2,a5
  55.  
  56.  addq #1,d3
  57.  subq #1,d1
  58.  bgt.s acrosslink
  59.  
  60.  addq #1,d2
  61.  subq #1,d0
  62.  bgt.s downlink
  63.  
  64. ; We have a list of points linked DIRECTLY to other
  65. ; points.
  66.  
  67. * Now repeatedly branch to a routine
  68. * which links up the indirect ones.
  69.  
  70.  move.w d7,d6
  71. repeat:
  72.  
  73.  moveq #0,d5
  74.  movem.l d0-d4/d6/d7/a0-a6,-(a7)
  75.  bsr indirect
  76.  movem.l (a7)+,d0-d4/d6/d7/a0-a6
  77.  
  78.  tst.b d5
  79.  beq.s nomoretodo
  80.  subq.w #1,d6
  81.  bgt.s repeat
  82.  
  83. nomoretodo:
  84.  
  85.  rts
  86.  
  87. indirect:
  88.  
  89.  moveq #0,d0
  90.  moveq #0,d1
  91.  move.l a1,a4
  92.  move.l a2,a5
  93.  
  94. downind:
  95.  moveq #0,d1
  96.  move.l a0,a3
  97.  
  98. acrossind:
  99.  
  100.  move.w #1000,d3
  101.  cmp.b #1,(a0)+
  102.  beq.s alreadydone
  103.  bgt.s .lookforwalk
  104.  tst.b (a1)
  105.  blt.s keepcheck
  106. .lookforwalk:
  107.  cmp.w #100,(a2)
  108.  blt.s alreadydone
  109.  
  110.  move.w (a2),d3
  111.  
  112. keepcheck:
  113.  
  114.  moveq #0,d2
  115.  move.w #-1,d6
  116.  movem.l a3/a4/a5,-(a7)
  117.  
  118. lookthroughloop:
  119.  cmp.b #1,(a3)+
  120.  bne.s notcon
  121.  move.w d2,d4
  122.  muls d7,d4
  123.  ext.l d1
  124.  add.l d1,d4
  125.  cmp.b #-1,(a4,d4.l)
  126.  beq.s notcon
  127.  
  128.  cmp.w (a5,d4.l*2),d3
  129.  ble.s notcon
  130.  
  131.  move.w (a5,d4.l*2),d3
  132.  move.b d2,d6
  133.  
  134. notcon
  135.  addq #1,d2
  136.  cmp.w d7,d2
  137.  blt.s lookthroughloop
  138.  
  139.  tst.b d6
  140.  blt.s notfoundone
  141.  
  142.  move.b d6,(a1)
  143.  add.w #1,d3
  144.  move.w d3,(a2)
  145.  st d5    ; made a change.
  146.  
  147. notfoundone:
  148.  
  149.  movem.l (a7)+,a3/a4/a5
  150.  
  151. alreadydone:
  152.  addq #1,a1
  153.  addq #2,a2
  154.  
  155.  addq #1,d1
  156.  cmp.w d7,d1
  157.  blt.s acrossind
  158.  addq #1,d0
  159.  cmp.w d7,d0
  160.  blt.s downind
  161.  
  162.  rts
  163.